package com.wenyl.linear.linkedlist;

import lombok.Data;

/**
 * @author Swimming Dragon
 * @description: 循环单链表
 * @date 2024年10月17日 15:12
 */
public class CycleLinkedList {
    // 头元素
    private CLLNode head;
    // 尾元素
    private CLLNode tail;
    // 元素个数
    private int length;
    public CycleLinkedList(){
        head = tail = null;
        length = 0;
    }
    /**
     * 在链表尾部插入元素
     * @param data 元素
     */
    public void add(int data){
        CLLNode node = new CLLNode(data);
        if(isEmpty()){
            head = node;
            tail = node;
            length++;
            return;
        }
        tail.setNext(node);
        // 循环单链表尾节点指向头节点
        node.setNext(head);
        tail = node;
        length++;
    }

    /**
     * 删除遇到的第一个元素值
     * @param data 元素值
     */
    public void delete(int data){
        // 没有元素
        if(isEmpty()){
            System.out.println("链表无数据，删除元素"+data+"失败");
            return;
        }
        // 只有一个元素，判断头元素即可
        if(size() == 1){
            if(head.getData()==data){
                head = tail = null;
                System.out.println("删除元素"+data+"成功");
                length--;
                return;
            }
        }
        // 从头元素开始遍历
        CLLNode currentNode = head;
        // 当前元素的上一个元素
        CLLNode preNode = null;
        do{
            // 删除元素，判断头元素、尾元素、其他元素三种情况
            if(currentNode.getData()==data){
                if(currentNode == head){
                    head = head.getNext();
                    currentNode.setNext(null);
                    tail.setNext(head);
                }else if(currentNode == tail){
                    tail = preNode;
                    preNode.setNext(null);
                    tail.setNext(head);
                }else{
                    preNode.setNext(currentNode.getNext());
                    currentNode.setNext(null);
                }
                length--;
                System.out.println("删除元素"+data+"成功");
                return;
            }
            preNode = currentNode;
            currentNode = currentNode.getNext();
        }while(currentNode != head);
        System.out.println("找不到元素"+data);
    }

    public void print(){
        if(isEmpty()){
            System.out.println("链表为空");
            return;
        }
        CLLNode currentNode = head;
        do{
            System.out.print(currentNode.getData()+"  ");
            currentNode = currentNode.getNext();
        }while(currentNode != head);
        System.out.println();
    }
    /**
     * @return 返回链表当前元素个数
     */
    public int size(){
        return length;
    }

    /**
     * @return 链表为空返回true，否则返回false
     */
    public boolean isEmpty(){
        return size() == 0;
    }
}

@Data
class CLLNode{
    private int data;
    private CLLNode next;
    public CLLNode(int data){
        this.data = data;
        this.next = null;
    }
}
